/**
 * 该方法用于深拷贝
 * 思路: 所谓深拷贝, 就是传入对象然后将对象里面的对象挨个弄出来赋值
 * 通过递归的方式
 * 首先是传入一个对象嘛, 这个是肯定的
 *
 */

function deepClone<T extends Array<T> | any>(obj: T): T {
  // 先判断传进来的是否是对象 如果不是直接返回
  if (typeof obj !== 'object' || obj === null) return obj
  // 这里声明一个新对象
  const result: T = obj instanceof Array ? ([] as T) : ({} as T)
  // 遍历对象, 将对象的键赋值给result, 如果值为对象, 那么进行递归
  for (const key in obj) {
    // 看到这里的操作了吗, 这里的操作是检查对象是否存在那个值, 如果存在就执行
    // 后面呢是不管你是不是对象, 都给我进行一遍递归
    // 反正如果你不是对象我直接返回的
    // forin可以遍历数组 key为index, 然后result会判断数据类型给它赋值, 如果是对象给对象, 反正亦然
    // 优雅的深拷贝
    // eslint-disable-next-line no-prototype-builtins
    if (obj.hasOwnProperty(key)) {
      result[key] = deepClone(obj[key])
    }
  }
  return result
}

export default deepClone
